#ifndef TCP_CLIENT_H
#define TCP_CLIENT_H

#include <iostream>
#include <string>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>

using namespace std;

class TCPClient {
private:
    string server_ip;    // 服务器IP地址
    int port;            // 服务器端口号
    int client_fd;       // 客户端套接字文件描述符
    struct sockaddr_in server_addr;  // 服务器地址结构

public:
    // 构造函数：初始化服务器IP和端口号
    TCPClient(const string &ip, int port) : server_ip(ip), port(port), client_fd(-1) {}

    // 析构函数：关闭客户端连接
    ~TCPClient() {
        disconnect();
    }

    // 连接到服务器
    bool connectToServer() {
        client_fd = socket(AF_INET, SOCK_STREAM, 0);
        if (client_fd == -1) {
            cerr << "创建套接字失败！" << endl;
            return false;
        }

        server_addr.sin_family = AF_INET;
        server_addr.sin_addr.s_addr = inet_addr(server_ip.c_str());
        server_addr.sin_port = htons(port);

        if (connect(client_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {
            cerr << "连接失败！" << endl;
            return false;
        }

        cout << "已连接到服务器！" << endl;
        return true;
    }

    // 断开与服务器的连接
    void disconnect() {
        if (client_fd != -1) {
            close(client_fd);
            cout << "已与服务器断开连接。" << endl;
        }
    }

    // 接收服务器发送的数据
    bool receiveData(string &data) {
        char buffer[1024];
        ssize_t bytes_received = recv(client_fd, buffer, sizeof(buffer) - 1, 0);
        if (bytes_received > 0) {
            buffer[bytes_received] = '\0';
            data = buffer;
            return true;
        }
        return false;
    }

    // 向服务器发送数据
    bool sendData(const string &data) {
        ssize_t bytes_sent = send(client_fd, data.c_str(), data.length(), 0);
        return bytes_sent > 0;
    }

    // 重载 << 操作符，向服务器发送数据
    TCPClient& operator<<(const string &data) {
        sendData(data);
        return *this;
    }

    // 重载 >> 操作符，从服务器接收数据
    TCPClient& operator>>(string &data) {
        receiveData(data);
        return *this;
    }
};

#endif // TCP_CLIENT_H
